﻿using System;
using System.Collections.Generic;
//4.6.3 迭代器
// 和foreach语句是枚举对象的使用者相对，迭代器是枚举对象的生产者。
namespace _110_枚举类型的迭代_迭代器
{
    class Test
    {
        //本例中，我们用迭代器返回Fibonacci数列表（Fibonacci数列表的每个数字是前两个数之和）：
        static IEnumerable<int> Fibs(int fibCount)
        {
            for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++)
            {
                yield return prevFib; // yield return
                int newFib = prevFib + curFib;
                prevFib = curFib;
                curFib = newFib;
            }
        }
        static void Main(string[] args)
        {
            foreach (int fib in Fibs(6))
            {
                Console.Write(fib + " ");
            }
            //return语句表示该方法返回的值，而yield return语句表示从本枚举器产生的下一个元素。在每条yield语句中，元素返回给调用者，但要维护被调用者的状态，这样方法才能在调用者索取下一个元素时继续执行。
            //被调用者状态的生命周期绑定在枚举器上，这样当调用者结束枚举时，状态可以被释放。
            //提示：编译器迭代方法转换成实现IEnumerable<T>和/或IEnumerator<T>的私有类，迭代器的程序块逻辑在编译器写的枚举类中，被“反转”并连接MoveNext方法和Current属性。这表明当调用迭代方法时，所做的只是实例化编译器写的类，编写的代码并不真正运行。编写的代码只有在开始遍历结果序列时才真正运行，典型的如foreach语句。
            Console.ReadKey();
        }
    }
}
